home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / BARNET / ARMLINUX / ACORNCD-PATCH < prev    next >
Text File  |  1998-03-22  |  6KB  |  163 lines

  1. This patch against version 2.1.89 extends the Linux iso9660 filing system
  2. to recognise Acorn extensions to CDROMs.  It replaces `_' with `!' where
  3. appropriate and appends `,xxx' to files which gives you filetypes when
  4. viewed over NFS.  It adds a new map type option to the driver; I felt
  5. this was more appropriate than the `noacorn' option which I originally
  6. implemented.  I can't imagine anyone wanting to use all-caps-with-.;1
  7. _and_ Acorn extensions since it rather misses the point.  I've also
  8. changed the driver to default to acorn mappings by default.  Since it
  9. implements a superset of the map=normal functionality (by calling the same
  10. function!) and will appear to be identical for non-acorn CDs, it seemed
  11. reasonable.
  12.  
  13. If any other vendor has something similar that should be supported,
  14. I've thought of a better way, but it would be slower and I don't think
  15. it's worth it until I see a CD-ROM with other extensions.
  16.  
  17. diff -ur linux/Documentation/filesystems/isofs.txt linuxn/Documentation/filesystems/isofs.txt
  18. --- linux/Documentation/filesystems/isofs.txt    Mon Mar 16 19:25:34 1998
  19. +++ linuxn/Documentation/filesystems/isofs.txt    Tue Mar 17 01:22:52 1998
  20. @@ -21,7 +21,8 @@
  21.    check=strict  Matches only filenames with the exact same case
  22.    cruft         Try to handle badly formatted CDs.
  23.    map=off       Do not map non-rockridge filenames to lowercase
  24. -  map=normal    Map rockridge filenames to lowercase
  25. +  map=normal    Map non-rockridge filenames to lowercase
  26. +  map=acorn     As map=normal but also apply Acorn extensions if present
  27.    mode=xxx      Sets the permissions on files to xxx
  28.    nojoliet      Ignore Joliet extensions if they are present.
  29.    norock        Ignore rockridge extensions if they are present.
  30. diff -ur linux/fs/isofs/dir.c linuxn/fs/isofs/dir.c
  31. --- linux/fs/isofs/dir.c    Mon Mar 16 19:26:36 1998
  32. +++ linuxn/fs/isofs/dir.c    Tue Mar 17 01:27:09 1998
  33. @@ -91,6 +91,32 @@
  34.      return i;
  35.  }
  36.  
  37. +/* Acorn extensions written by Matthew Wilcox <willy@bofh.ai> 1998 */
  38. +int get_acorn_filename(struct iso_directory_record * de,
  39. +                char * retname, struct inode * inode)
  40. +{
  41. +    int std;
  42. +    unsigned char * chr;
  43. +    int retnamlen = isofs_name_translate(de->name,
  44. +                de->name_len[0], retname);
  45. +    if (retnamlen == 0) return 0;
  46. +    std = sizeof(struct iso_directory_record) + de->name_len[0];
  47. +    if (std & 1) std++;
  48. +    if ((*((unsigned char *) de) - std) != 32) return retnamlen;
  49. +    chr = ((unsigned char *) de) + std;
  50. +    if (strncmp(chr, "ARCHIMEDES", 10)) return retnamlen;
  51. +    if ((*retname == '_') && ((chr[19] & 1) == 1)) *retname = '!';
  52. +    if (((de->flags[0] & 2) == 0) && (chr[13] == 0xff)
  53. +        && ((chr[12] & 0xf0) == 0xf0))
  54. +    {
  55. +        retname[retnamlen] = ',';
  56. +        sprintf(retname+retnamlen+1, "%3.3x",
  57. +            ((chr[12] & 0xf) << 8) | chr[11]);
  58. +        retnamlen += 4;
  59. +    }
  60. +    return retnamlen;
  61. +}
  62. +
  63.  /*
  64.   * This should _really_ be cleaned up some day..
  65.   */
  66. @@ -230,15 +256,17 @@
  67.                  p = tmpname;
  68.              } else
  69.  #endif
  70. -            {
  71. -                if (inode->i_sb->u.isofs_sb.s_mapping == 'n') {
  72. -                    len = isofs_name_translate(de->name, de->name_len[0],
  73. -                                   tmpname);
  74. -                    p = tmpname;
  75. -                } else {
  76. -                    p = de->name;
  77. -                    len = de->name_len[0];
  78. -                }
  79. +            if (inode->i_sb->u.isofs_sb.s_mapping == 'a') {
  80. +                len = get_acorn_filename(de, tmpname, inode);
  81. +                p = tmpname;
  82. +            } else
  83. +            if (inode->i_sb->u.isofs_sb.s_mapping == 'n') {
  84. +                len = isofs_name_translate(de->name,
  85. +                    de->name_len[0], tmpname);
  86. +                p = tmpname;
  87. +            } else {
  88. +                p = de->name;
  89. +                len = de->name_len[0];
  90.              }
  91.          }
  92.          if (len > 0) {
  93. diff -ur linux/fs/isofs/inode.c linuxn/fs/isofs/inode.c
  94. --- linux/fs/isofs/inode.c    Mon Mar 16 19:26:36 1998
  95. +++ linuxn/fs/isofs/inode.c    Tue Mar 17 01:40:25 1998
  96. @@ -92,7 +92,7 @@
  97.  {
  98.      char *this_char,*value;
  99.  
  100. -    popt->map = 'n';
  101. +    popt->map = 'a';
  102.      popt->rock = 'y';
  103.      popt->joliet = 'y';
  104.      popt->cruft = 'n';
  105. @@ -151,10 +151,11 @@
  106.          } else
  107.  #endif
  108.          if (!strcmp(this_char,"map") && value) {
  109. -            if (value[0] && !value[1] && strchr("on",*value))
  110. +            if (value[0] && !value[1] && strchr("ano",*value))
  111.                  popt->map = *value;
  112.              else if (!strcmp(value,"off")) popt->map = 'o';
  113.              else if (!strcmp(value,"normal")) popt->map = 'n';
  114. +            else if (!strcmp(value,"acorn")) popt->map = 'a';
  115.              else return 0;
  116.          }
  117.          else if (!strcmp(this_char,"check") && value) {
  118. diff -ur linux/fs/isofs/namei.c linuxn/fs/isofs/namei.c
  119. --- linux/fs/isofs/namei.c    Wed Dec  3 12:24:29 1997
  120. +++ linuxn/fs/isofs/namei.c    Tue Mar 17 01:35:33 1998
  121. @@ -178,6 +178,9 @@
  122.              dlen = get_joliet_filename(de, dir, page);
  123.              dpnt = page;
  124.  #endif
  125. +        } else if (dir->i_sb->u.isofs_sb.s_mapping == 'a') {
  126. +            dlen = get_acorn_filename(de, page, dir);
  127. +            dpnt = page;
  128.          } else if (dir->i_sb->u.isofs_sb.s_mapping == 'n') {
  129.              for (i = 0; i < dlen; i++) {
  130.                  c = dpnt[i];
  131. diff -ur linux/include/linux/iso_fs.h linuxn/include/linux/iso_fs.h
  132. --- linux/include/linux/iso_fs.h    Mon Mar 16 19:25:49 1998
  133. +++ linuxn/include/linux/iso_fs.h    Mon Mar 16 21:05:09 1998
  134. @@ -182,6 +182,7 @@
  135.  extern int find_rock_ridge_relocation(struct iso_directory_record *, struct inode *);
  136.  
  137.  int get_joliet_filename(struct iso_directory_record *, struct inode *, unsigned char *);
  138. +int get_acorn_filename(struct iso_directory_record *, char *, struct inode *);
  139.  
  140.  /* The stuff that follows may be totally unneeded. I have not checked to see 
  141.   which prototypes we are still using.  */
  142. @@ -227,6 +228,3 @@
  143.  #endif /* __KERNEL__ */
  144.  
  145.  #endif
  146. -
  147. -
  148. -
  149. diff -ur linux/include/linux/iso_fs_sb.h linuxn/include/linux/iso_fs_sb.h
  150. --- linux/include/linux/iso_fs_sb.h    Mon Mar 16 19:25:49 1998
  151. +++ linuxn/include/linux/iso_fs_sb.h    Tue Mar 17 01:43:54 1998
  152. @@ -30,10 +30,3 @@
  153.  };
  154.  
  155.  #endif
  156. -
  157. -
  158. -
  159. -
  160. -
  161. -
  162. -
  163.